/*
 * @Author: 0x9DEFA478
 * @Date: 2022-01-21 19:58:34
 * @LastEditTime: 2022-06-27 19:45:01
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#include "IP_SAI.h"
#include "System/System.h"




extern void IP_SAI_MasterTx_DMA_IRQ(void* v);




static void SetMCLKDIV(IP_SAI_Block* ip_sai,unsigned int MCLKDIV){
  unsigned int CR1;

  CR1=cIP_SAI_SAI(ip_sai)->CR1;

  if((CR1&SAI_xCR1_OUTDRIV)!=0U){

    CR1&=(~SAI_xCR1_OUTDRIV);
    cIP_SAI_SAI(ip_sai)->CR1=CR1;

    CR1=(CR1&(~SAI_xCR1_MCKDIV_Msk))|(SAI_xCR1_MCKDIV_Msk&(MCLKDIV<<SAI_xCR1_MCKDIV_Pos));
    cIP_SAI_SAI(ip_sai)->CR1=CR1;

    CR1|=SAI_xCR1_OUTDRIV;
    cIP_SAI_SAI(ip_sai)->CR1=CR1;
  }
  else{
    CR1=(CR1&(~SAI_xCR1_MCKDIV_Msk))|(SAI_xCR1_MCKDIV_Msk&(MCLKDIV<<SAI_xCR1_MCKDIV_Pos));
    cIP_SAI_SAI(ip_sai)->CR1=CR1;
  }

}

static unsigned int GetMCLKDIV(IP_SAI_Block* ip_sai){

  return (cIP_SAI_SAI(ip_sai)->CR1&SAI_xCR1_MCKDIV_Msk)>>SAI_xCR1_MCKDIV_Pos;
}




/**
 * @brief 初始化 IP_I2S 仅发送模式
 * @param ip_sai 空的IP_SAI_Block对象(已分配内存的)
 * @param DMA 初始化好的dma对象
 * @param _sai sai句柄
 * @return 无
 */
void IP_SAI_MasterTx_Init(IP_SAI_Block* ip_sai,IP_DMA* DMA,SAI_Block_TypeDef* _sai){

  cIP_SAI_SAI(ip_sai)=_sai;//实例传入
  ip_sai->Instance.DMA=DMA;

  cIP_SAI_DMA(ip_sai)->PAR=(unsigned int)&cIP_SAI_SAI(ip_sai)->DR;

  cIP_SAI_SAI(ip_sai)->IMR&=(~(SAI_xIMR_OVRUDRIE|SAI_xIMR_MUTEDETIE|SAI_xIMR_WCKCFGIE|SAI_xIMR_CNRDYIE|SAI_xIMR_AFSDETIE|SAI_xIMR_FREQIE|SAI_xIMR_LFSDETIE));//失能中断
  cIP_SAI_SAI(ip_sai)->CR2|=SAI_xCR2_MUTEVAL;//静音时发送上一个数据
  cIP_SAI_SAI(ip_sai)->CR1|=SAI_xCR1_DMAEN;//使能DMA请求

  ip_sai->MCLKDIV=GetMCLKDIV(ip_sai);

}

/**
 * @brief 开始SAI传输
 * @param ip_sai IP_SAI_Block句柄
 * @param SizeOfDataPack 每个数据包大小(单位:字节) 必须为4的倍数
 * @param Callback 获取数据的方法
 * @param Callback_v GetData_Callback传入的参数
 * @return 无
 */
void IP_SAI_MasterTx_Start(IP_SAI_Block* ip_sai,int SizeOfDataPack,void* (*Callback)(void*,int),void* Callback_v){

  ip_sai->Mode.Master.ReadDataCallback=Callback;
  ip_sai->Mode.Master.v_ReadDataCallback=Callback_v;


  ip_sai->Instance.DMA->SetIrqCallback(IP_SAI_MasterTx_DMA_IRQ,ip_sai);

  cIP_SAI_DMA(ip_sai)->NDTR=SizeOfDataPack/4;
  cIP_SAI_DMA(ip_sai)->M0AR=(unsigned int)ip_sai->Mode.Master.ReadDataCallback(ip_sai->Mode.Master.v_ReadDataCallback,0);
  cIP_SAI_DMA(ip_sai)->M1AR=(unsigned int)ip_sai->Mode.Master.ReadDataCallback(ip_sai->Mode.Master.v_ReadDataCallback,0);

  cIP_SAI_DMA(ip_sai)->CR&=(~DMA_SxCR_CT);//缓存0
  cIP_SAI_DMA(ip_sai)->CR|=DMA_SxCR_DBM;//使能双缓存
  
  cIP_SAI_DMA(ip_sai)->CR|=DMA_SxCR_TCIE;//使能完成中断

  oIP_DMA_ClearAllBit_IFCR(ip_sai->Instance.DMA);

  
  System_CompileBarrier();

  cIP_SAI_DMA(ip_sai)->CR|=DMA_SxCR_EN;//使能DMA
  cIP_SAI_SAI(ip_sai)->CR1|=SAI_xCR1_SAIEN;//使能SAI

}

/**
 * @brief 停止SAI传输
 * @param ip_sai IP_SAI_Block句柄
 * @return 无
 */
void IP_SAI_MasterTx_Stop(IP_SAI_Block* ip_sai){
  unsigned int CR;
  unsigned int CR1;

  CR1=cIP_SAI_SAI(ip_sai)->CR1;
  if((CR1&SAI_xCR1_SAIEN)!=0U){
    CR1&=(~SAI_xCR1_SAIEN);//失能sai
    cIP_SAI_SAI(ip_sai)->CR1=CR1;

    while((cIP_SAI_SAI(ip_sai)->CR1&SAI_xCR1_SAIEN)!=0){
    }
  }

  CR=cIP_SAI_DMA(ip_sai)->CR;
  if((CR&DMA_SxCR_EN)!=0U){
    CR&=(~DMA_SxCR_EN);
    cIP_SAI_DMA(ip_sai)->CR=CR;//关闭DMA
  }

  cIP_SAI_SAI(ip_sai)->CR2|=SAI_xCR2_FFLUSH;//清空fifo

}

/**
 * @brief 设置SAI MCLK分频 在SAI停止的情况下使用
 * @param ip_sai IP_SAI_Block句柄
 * @param MCLKDIV 分频系数
 * @return 无
 */
void IP_SAI_MasterTx_SetMCLKDIV(IP_SAI_Block* ip_sai,unsigned int MCLKDIV){

  if(ip_sai->MCLKDIV==MCLKDIV){
    return;
  }

  ip_sai->MCLKDIV=MCLKDIV;

  SetMCLKDIV(ip_sai,MCLKDIV);

}



